/**   
* @Title: GroupTemplateTest.java
* @Package com.grouptemplate
* @Description: TODO(字符串模板加载器)
* @author antch,861710865@qq.com   
* @date 2017年7月2日 下午4:03:12
* @version V1.0   
*/

package com.grouptemplate;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.beetl.core.Configuration;
import org.beetl.core.GroupTemplate;
import org.beetl.core.Template;
import org.beetl.core.resource.ClasspathResourceLoader;
import org.beetl.core.resource.FileResourceLoader;
import org.beetl.core.resource.StringTemplateResourceLoader;

/**
 * @ClassName: GroupTemplateTest
 * @Description: TODO(字符串模板加载器)
 * @author antch,861710865@qq.com
 * @date 2017年7月2日 下午4:03:12
 * 
 */

public class GroupTemplateTest {

	/**
	 * @Title: main @Description: TODO(这里用一句话描述这个方法的作用) @param @param args
	 *         设定文件 @return void 返回类型 @throws
	 */

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("**模板引擎测试**");
		System.out.println("文件加载器测试——————》");
		fileTRL();

		System.out.println("===============");
		System.out.println("类资源加载器------->");
		classPTRL();
	}

	/**
	 * 
	 * @Title: strTRL @Description: TODO(字符串模板加载器) @param 设定文件 @return void
	 * 返回类型 @throws
	 */
	public static void strTRL() {
		/**
		 * Beetl的核心是GroupTemplate， 创建GroupTemplate需要俩个参数，一个是模板资源加载器，
		 * 一个是配置类，模板资源加载器Beetl内置了6种，分别是
		 * StringTemplateResourceLoader：字符串模板加载器，用于加载字符串模板，如本例所示
		 * FileResourceLoader：文件模板加载器，需要一个根目录作为参数构造，传入getTemplate方法的String是模板文件相对于Root目录的相对路径
		 * ClasspathResourceLoader：文件模板加载器，模板文件位于Classpath里
		 * WebAppResourceLoader：用于webapp集成，假定模板根目录就是WebRoot目录，参考web集成章 MapResourceLoader
		 * : 可以动态存入模板 CompositeResourceLoader 混合使用多种加载方式
		 * 
		 * 
		 */

		/**
		 * template提供了多种获得渲染输出的方法，: tempalte.render() 返回渲染结果，如本例所示
		 * template.renderTo(Writer) 渲染结果输出到Writer里 template.renderTo(OutputStream )
		 * 渲染结果输出到OutputStream里
		 */

		StringTemplateResourceLoader resourceLoader = new StringTemplateResourceLoader();
		try {
			Configuration configuration = Configuration.defaultConfiguration();
			GroupTemplate groupTemplate = new GroupTemplate(resourceLoader, configuration);
			Template template = groupTemplate.getTemplate("hello,${name}");
			template.binding("name", "小安子----------筑梦");
			System.out.println("输出：：" + template.render());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @Title: fileTRL @Description: TODO(文件资源模板加载器) @param 设定文件 @return void
	 * 返回类型 @throws
	 */
	public static void fileTRL() {
		/**
		 * 更通常情况下，模板资源是以文件形式管理的， 集中放在某一个文件目录下（如webapp的模板根目录就可能是 WEB-INF/template里），因此，
		 * 可以使用FileResourceLoader来加载模板实例
		 */

		/**
		 * 说明：： 第1行代码指定了模板根目录，即位于项目工程下的template目录 第2行构造了一个资源加载器， 并指定字符集为UTF-8
		 * (也可不指定，因为配置文件默认就是UTF-8); 第5行通过模板的相对路径/s01/hello.txt来加载模板
		 */
		String root = System.getProperty("user.dir") + File.separator + "template";
		System.out.println("模板资源文件的根目录：：" + root);
		FileResourceLoader fileResourceLoader = new FileResourceLoader(root, "utf-8");
		Configuration configuration;
		try {
			configuration = Configuration.defaultConfiguration();
			GroupTemplate groupTemplate = new GroupTemplate(fileResourceLoader, configuration);

			Template template = groupTemplate.getTemplate("s01/hello.txt");
			
			//全局变量
			/**
			 * 局变量是通过template.binding传入的变量,
			 * 这些变量能在模板的任何一个地方，包括子模板都能访问到
			 */
			template.binding("names", "张三丰");
			
			/**
			 * 共享变量指在所有模板中都可以引用的变量，
			 * 可通过groupTemplate.setSharedVars(Map sharedVars)
			 * 传入变量,这些变量能用在 所有模板 的任何一个地方
			 */
			Map<String, Object> shared = new HashMap<String, Object>();
			shared.put("names2", "张无忌");
			groupTemplate.setSharedVars(shared);
			
			
			
			System.out.println("文件模板内容：：" + template.render());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 
	 * @Title: classPTRL @Description: TODO(classpath资源模板加载器) @param 设定文件 @return
	 * void 返回类型 @throws
	 */
	public static void classPTRL() {

		ClasspathResourceLoader classpathResourceLoader = new ClasspathResourceLoader("com/grouptemplate/");
		Configuration configuration;
		try {
			configuration = Configuration.defaultConfiguration();

			GroupTemplate gt = new GroupTemplate(classpathResourceLoader, configuration);

			Template template = gt.getTemplate("hello.txt");
			System.out.println("模板内容：：" + template.render());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
